package org.centsuse.intention_spring.invention.utils;

import org.centsuse.intention_spring.invention.config.scenes.Parameter;
import org.centsuse.intention_spring.invention.config.scenes.SceneSlotTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数据格式化工具类
 */
public class DataformatUtils {

//    // 提取第一个浮点数
//    public static double extractFloat(String s) {
//        String floatPattern = "-?\\d+(?:\\.\\d+)?";
//        Matcher matcher = Pattern.compile(floatPattern).matcher(s);
//        if (matcher.find()) {
//            try {
//                return Double.parseDouble(matcher.group());
//            } catch (NumberFormatException e) {
//                return 0.0;
//            }
//        }
//        return 0.0;
//    }

    // 提取所有浮点数
    public static List<Double> extractFloats(String s) {
        List<Double> result = new ArrayList<>();
        String floatPattern = "-?\\d+(?:\\.\\d+)?";
        Matcher matcher = Pattern.compile(floatPattern).matcher(s);
        while (matcher.find()) {
            try {
                result.add(Double.parseDouble(matcher.group()));
            } catch (NumberFormatException ignored) {
            }
        }
        return result.isEmpty() ? List.of(0.0) : result;
    }

    // 清理JSON字符串
    public static String cleanJsonString(String jsonStr) {
        Pattern pattern = Pattern.compile("(\\{.*}|\\[.*])");
        Matcher matcher = pattern.matcher(jsonStr);
        if (matcher.find()) {
            return matcher.group(1);
        }
        return null;
    }

    /**
     * 从字符串中提取第一个浮点型数字（包含整数、小数和负数形式）
     * 该方法使用正则表达式匹配以下形式的数字：
     * - 可选的负号: -
     * - 至少一个数字: \d+
     * - 可选的小数部分: .后跟至少一个数字
     * 示例：
     * "price: -123.45 USD" -> -123.45
     * "42 is the answer"    -> 42.0
     * "version 3.14.15"     -> 3.14
     * "no numbers here"     -> 0.0
     *
     * @param text 要解析的输入字符串，可能包含数字和其他字符
     * @return 第一个匹配的浮点数值，如果没有匹配则返回0.0
     *
     * @注意 不匹配科学计数法（如1e3）或前导小数点形式（如.5）
     */
    public static float extractFloat(String text) {
        // 实现浮点数提取逻辑
        // 定义正则表达式模式
        String floatPattern = "-?\\d+(?:\\.\\d+)?";
        Pattern pattern = Pattern.compile(floatPattern);
        Matcher matcher = pattern.matcher(text);

        ArrayList<String> found = new ArrayList<>();

        // 查找所有匹配项
        while (matcher.find()) {
            found.add(matcher.group());
        }

        // 处理匹配结果
        if (found.isEmpty()) {
            return 0.0f;
        } else {
            return Float.parseFloat(found.get(0));
        }
    }

    public static String extractContinuousDigit(String text) {
        // 实现连续数字提取逻辑
        return text.replaceAll("[^0-9]", "");
    }

    public static List<String> extractContinuousDigits(String text) {
        List<String> result = new ArrayList<>();
        if (text == null || text.isEmpty()) {
            return result;
        }

        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            result.add(matcher.group());
        }

        return result;
    }

    /**
     * @description 针对deepseek思考过程截取
     * @param input
     * @return
     */
    public static String extractAfterLastThink(String input) {
        if (input == null || input.isEmpty()) {
            return "";
        }

        final String marker = "</think>";
        int lastIndex = input.lastIndexOf(marker);

        if (lastIndex == -1) {
            return input; // 无标记则返回原内容
        } else {
            // 截取标记后的内容（索引位置 + 标记长度）
            return input.substring(lastIndex + marker.length());
        }
    }

    /**
     * @description 根据参数模板生成槽值列表
     * @param parameters parameters
     * @return List<SceneSlotTemplate>
     */
    public static Map<String, SceneSlotTemplate> convertToSlotTemplate(List<Parameter> parameters) {
        Map<String, SceneSlotTemplate> result = new HashMap<>();
        if (null == parameters || parameters.isEmpty()) {
            return result;
        }
        for (Parameter parameter : parameters) {
            SceneSlotTemplate template = new SceneSlotTemplate();
            template.setName(parameter.getName());
            template.setDesc(parameter.getDesc());
            template.setType(parameter.getType());
            result.put(parameter.getName(), template);
        }
        return result;
    }
}
